package com.hd.trans.extension

import android.content.Context
import android.graphics.drawable.Drawable
import android.text.Html
import android.text.Spanned
import android.text.TextUtils
import android.widget.EditText
import android.widget.ScrollView
import android.widget.TextView
import androidx.core.content.res.ResourcesCompat
import com.google.gson.Gson
import java.io.File
import java.util.Locale
import java.util.regex.Pattern


val gson = Gson()

/**
 * 去除字符串中的空格、回车、换行符、制表符
 * @return
 */
fun String.deleteSpaceChar(): String {
//    val pattern = Pattern.compile("\\s*|\t|\r|\n")
//    val m = pattern.matcher(this)
//    return m.replaceAll("").trim { it <= ' ' }
    return this
}
fun String.lowercase(): String = this.toLowerCase(Locale.ROOT)

fun String.asFileName() = File(this).name

fun String.isPPT() = this.lowercase().endsWith(".ppt") || this.lowercase().endsWith(".pptx")

fun String.isPdf() = this.lowercase().endsWith(".pdf")

fun String.isWord() = this.lowercase().endsWith(".doc") || this.lowercase().endsWith(".docx")

fun String.isExcel() = this.lowercase().endsWith(".xls") || this.lowercase().endsWith(".xlsx")

fun String.isText() = this.lowercase().endsWith(".txt") || this.lowercase().endsWith(".json")

fun String.isHtml() = this.lowercase().endsWith(".html")

/**
 * 压缩类格式
 */
fun String.isCompressedFile() = this.lowercase().endsWith(".zip")
        || this.lowercase().endsWith(".7z")
        || this.lowercase().endsWith(".rar")
        || this.lowercase().endsWith(".tar")
        || this.lowercase().endsWith(".bz2")
        || this.lowercase().endsWith(".gz")

/**
 * 图片类格式
 */
fun String.isImage() = this.lowercase().endsWith(".jpg")
        || this.lowercase().endsWith(".jpeg")
        || this.lowercase().endsWith(".png")
        || this.lowercase().endsWith(".gif")
        || this.lowercase().endsWith(".bmp")
        || this.lowercase().endsWith(".webp")

/**
 * 视频类格式
 */
fun String.isVideo() = this.lowercase().endsWith(".mp4")
        || this.lowercase().endsWith(".avi")
        || this.lowercase().endsWith(".mov")
        || this.lowercase().endsWith(".mkv")
        || this.lowercase().endsWith(".flv")
        || this.lowercase().endsWith(".wmv")
/**
 * 音频类格式
 */
fun String.isAudio() = this.lowercase().endsWith(".mp3")
        || this.lowercase().endsWith(".wav")
        || this.lowercase().endsWith(".aac")
        || this.lowercase().endsWith(".ogg")
        || this.lowercase().endsWith(".flac")
/**
 * 文档类格式
 */
fun String .isDocument() = this.lowercase().endsWith(".doc")
        || this.lowercase().endsWith(".docx")
        || this.lowercase().endsWith(".xls")
        || this.lowercase().endsWith(".xlsx")
        || this.lowercase().endsWith(".ppt")
        || this.lowercase().endsWith(".pptx")
        || this.lowercase().endsWith(".pdf")
        || this.lowercase().endsWith(".txt")
        || this.lowercase().endsWith(".json")
        || this.lowercase().endsWith(".html")

/**
 * 文件夹
 */
fun String.isFolder() = this.lowercase().endsWith("/")

/**
 * 刨除掉空格,字符串是否为空
 */
fun String?.isNormalCharsEmpty(): Boolean {
    return if (this == null) {
        true
    } else {
        TextUtils.isEmpty(deleteSpaceChar())
    }
}

/**
 * 删除字符串中的特殊字符串
 * @return
 */
fun String.deleteSpecialChar(): String {
    // 只允许中 英文 数字
    val pattern =
        Pattern.compile("[-_`~!@#$%^&*()+=|{}':;',\\\\[\\\\].<>/?~！@#￥%……&*（）——+|{}【】‘；：”“’。，、？]|\\n|\\r|\\t")
    val matcher = pattern.matcher(this)
    val newString = matcher.replaceAll("").trim { it <= ' ' }.replace(" ", "").replace("\\", "")
    return newString
}

fun String?.toNotNull(): String {
    return this ?: ""
}

fun TextView.getTrimText(): String {
    return text.toString().trim()
}

fun TextView.getTrimTextLength(): Int {
    return text.toString().trim().length
}

fun String?.getTrimText(): String {
    if (this == null) return ""
    return this.trim()
}

fun Any?.toJsonString(): String {
    return if (this == null) {
        ""
    } else {
        gson.toJson(this)
    }
}


/**
 * 显示光标
 * 思路：设置焦点和touch焦点，主动调用onClick设置
 */
fun EditText.showCursor() {
    requestFocus()
    callOnClick()
}

/**
 * 获取焦点并显示光标到尾部
 */
fun EditText.requestFocusAndShowCursor() {
    isCursorVisible = true
    isFocusable = true
    isFocusableInTouchMode = true
    requestFocus()
}


/**
 * 隐藏焦点
 */
fun EditText.hideFocusAndHideCursor() {
    isFocusable = false
    isFocusableInTouchMode = false
}

fun String.toHtmlSpanned(context: Context): Spanned {
    return Html.fromHtml(this, Html.ImageGetter {
        val id: Int = it.toInt()
        val drawable: Drawable? = ResourcesCompat.getDrawable(context.resources, id, null)
        drawable?.setBounds(0, 0, drawable.intrinsicWidth, drawable.intrinsicHeight)
        return@ImageGetter drawable
    }, null)
}

fun EditText.scrollToBottom(scrollView: ScrollView) {
    post {
        var offset: Int = measuredHeight - scrollView.measuredHeight
        if (offset < 0) {
            offset = 0
        }
        setSelection(length())
        scrollView.scrollTo(0, offset + 50)
    }
}

fun TextView.scrollToBottom(scrollView: ScrollView) {
    post {
        scrollView.smoothScrollTo(0, bottom)
    }
}

fun String?.charAt(index: Int,def:Char? = null): Char? {
    if (this.isNullOrEmpty()) {
        return def
    }
    if (index < 0 || index >= this.length) {
        return def
    }
    return this[index]
}

fun String?.existsFile(): Boolean {
    if (this.isNullOrEmpty()) {
        return false
    }
    val file = File(this)
    return if (file.isFile){
        file.canRead() && file.exists() && file.length() > 0
    }
    else{
        file.canRead() && file.exists()
    }
}